package com.asiainfo.iam.tool;


import org.springframework.stereotype.Component;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.HashMap;

@Component
public class VerifyUtil {

    // 使用HMAC-SHA256算法
    private static final String ALGORITHM = "HmacSHA256";
    // 密钥（实际应用中应从安全渠道获取，不要硬编码）
    private static final String SECRET_KEY = "key";

    /**
     * 生成签文
     * @param base64Str 待签名的Base64编码字符串
     * @return 生成的签文（十六进制字符串）
     */
    public  HashMap<String, String> generateSignature(String base64Str) {
        try {
            // 解码Base64字符串
            byte[] decodedBytes = Base64.getDecoder().decode(base64Str);
            HashMap<String, String> map = new HashMap<>();

            // 初始化HMAC
            Mac mac = Mac.getInstance(ALGORITHM);
            SecretKeySpec keySpec = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), ALGORITHM);
            mac.init(keySpec);

            // 计算并返回签文
            byte[] signatureBytes = mac.doFinal(decodedBytes);
            map.put("b64SignedData",bytesToHex(signatureBytes));
            map.put("b64Cert", "cert");
            return map;
        } catch (Exception e) {
            throw new RuntimeException("生成签文失败: " + e.getMessage(), e);
        }
    }

//    /**
//     * 验证签文
//     * @param base64Str 原始Base64编码字符串
//     * @param signature 待验证的签文
//     * @return 0表示验签成功，1表示验签失败，2表示异常
//     */
//    public  int verifySignature(String base64Str, String signature) {
//        try {
//            // 生成新的签文进行比对
//            String generatedSignature = generateSignature(base64Str).get("b64SignedData");
//            return generatedSignature.equalsIgnoreCase(signature) ? 0 : 0;
//        } catch (Exception e) {
//            return 1; // 发生异常时返回1
//        }
//    }
    /**
     * 验证签文：检测数据库字段是否被篡改
     * @param originalBase64 原始数据库字段的Base64编码
     * @param signature 原始签文
     * @return 0=验签成功（未篡改），1=验签失败（已篡改），2=异常
     */
    public int verifySignature(String originalBase64, String signature) {
        try {
            // 1. 重新生成签文
            String newSignature = generateSignature(originalBase64).get("b64SignedData");

            // 2. 比对签文（忽略大小写，十六进制不区分大小写）
            if (newSignature.equalsIgnoreCase(signature)) {
                return 0; // 未篡改，验签成功
            } else {
                return 1; // 已篡改，验签失败
            }
        } catch (Exception e) {
            return 2; // 发生异常
        }
    }

    /**
     * 将字节数组转换为十六进制字符串
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xFF & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }


}
